package ar.com.duam.porky.movil;

import static ar.com.duam.porky.movil.ConstantesPorky.DEFAULT_USERNAME;

import java.util.concurrent.ExecutionException;

import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ListadoMovimientosActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>
{	
	private SimpleCursorAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        Log.d("listado_movimientos", "onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listado_movimientos);
    }

    @Override
	protected void onResume() 
    {
    	Log.d("listado_movimientos", "onResume");
		super.onResume();
		
        SharedPreferences prefs = getSharedPreferences(ConstantesPorky.PREFS_NAME, MODE_PRIVATE);
        String username = prefs.getString("username", DEFAULT_USERNAME);
        
        if (username == null || username.equals(DEFAULT_USERNAME))
        {
        	logout();
        }
        else
        {
        	TextView saludo = (TextView) findViewById(R.id.saludo);
        	saludo.setText("Hola, "+ username);
        }        
        
        ListView lwMovimientos = (ListView) this.findViewById(R.id.lwMovimientos);

        String[] fromColumns = {Movimiento.COLUMN_FECHA, Concepto.COLUMN_NOMBRE, Movimiento.COLUMN_IMPORTE};
        int[] toViews = {R.id.movimiento_fecha, R.id.concepto_nombre, R.id.movimiento_importe}; // The TextView in simple_list_item_1

        mAdapter = new SimpleCursorAdapter(this, R.layout.movimiento_entry, null, fromColumns, toViews, 0);
        lwMovimientos.setAdapter(mAdapter);        

        getSupportLoaderManager().initLoader(0, null, this).forceLoad();
	}

    public void sincronizar()
    {
        SharedPreferences prefs = getSharedPreferences(ConstantesPorky.PREFS_NAME, MODE_PRIVATE);
        String username = prefs.getString("username", DEFAULT_USERNAME);
        
    	PorkyOpenHelper helper = new PorkyOpenHelper(this.getApplicationContext());
    	
    	Usuario usuario = helper.getUsuario(username);
    	
		Syncro syncro = new Syncro();

		try
		{
			String mensaje = syncro.subirMovimientos(this.getApplicationContext(), usuario)? "Sincronizado con �xito!": "No se pudo sincronizar...";
			
			Log.d("sincronizar", "Actualizar el listado de movimientos.");
			getSupportLoaderManager().restartLoader(0, null, this).forceLoad();
			
			pop(mensaje);
		}
		catch (PorkyException ex)
		{
			pop(ex.getMessage());         
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		} 
		catch (ExecutionException e) 
		{
			e.printStackTrace();
		}
    }
    
    private void pop(String message)
    {
		Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG);
		toast.setGravity(Gravity.CENTER, 0, 0);
		toast.show();
    }
    
	private void logout()
    {
    	Intent intent = new Intent(this, ActivityLogin.class);
    	startActivity(intent);
    }
    
    public void cerrarSesion()
    {
    	logout();
    }
    
    public void nuevoMovimiento(View view)
    {
    	Intent intent = new Intent(this, FormularioMovimientoActivity.class);
    	startActivity(intent);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        getMenuInflater().inflate(R.menu.activity_listado_movimientos, menu);
        return true;
    }

	@Override
	public boolean onOptionsItemSelected(MenuItem item) 
	{
		switch (item.getItemId())
		{
			case R.id.sincronizar:
				sincronizar();
				return true;
			case R.id.cerrarSesion:
				cerrarSesion();
				return true;
			case R.id.salir:
				finish();
				return true;
			default:
				return super.onOptionsItemSelected(item);			
		}
	}

	public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) 
	{
		Log.d("listado_movimientos", "onCreateLoader");
		
		return new AsyncTaskLoader<Cursor>(getApplicationContext())
		{
			@Override
			public Cursor loadInBackground() 
			{
				Log.d("listado_movimientos", "Creando el cursor a SQLite (movimientos)");
		        SQLiteDatabase db = new PorkyOpenHelper(ListadoMovimientosActivity.this).getReadableDatabase();
		        
		        return db.rawQuery("select "+ Movimiento.TABLE_NAME +"."+ Movimiento.COLUMN_ID +" as _id, "+ 
		        		"strftime('%d-%m-%Y', "+ Movimiento.COLUMN_FECHA +") as fecha, "+ Concepto.COLUMN_NOMBRE +", "+ 
		        		" '$ '||"+ Movimiento.COLUMN_IMPORTE +" as importe from "+ Movimiento.TABLE_NAME+
		        		", "+ Concepto.CONCEPTOS_TABLE_NAME +" where "+ Concepto.CONCEPTOS_TABLE_NAME +"."+ Concepto.COLUMN_ID+
		        		" = "+ Movimiento.TABLE_NAME +"."+ Movimiento.COLUMN_CONCEPTO_ID, null);
			}
		};
	}

	public void onLoadFinished(Loader<Cursor> loader, Cursor data) 
	{
		Log.d("listado_movimientos", "onLoadFinished: "+ data.getCount());
		mAdapter.swapCursor(data);
		data.close();
	}

	public void onLoaderReset(Loader<Cursor> arg0) 
	{
		mAdapter.swapCursor(null);
	}

}
